package cn.com.common.job.task;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.quartz.DisallowConcurrentExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

import cn.com.common.constants.Constants;
import cn.com.gas.entity.GasStationinfoEntity;
import cn.com.gas.service.GasStationinfoService;
import cn.com.util.HmacSha256Utils;
import cn.com.util.MD5Utils;
import cn.com.util.RestTemplateUtil;
import cn.com.util.TsBqUtils;

/**
 * 定时任务(演示Demo，可删除) testTask为spring bean的名称， 方法名称必须是run
 *
 * @author wenbin
 * @version V1.0
 * @date 2020年3月18日
 */
@Component("gasStationInfoProcessTask")
@DisallowConcurrentExecution
public class GasStationInfoProcessTask {
	
	@Value("${gasstation.timedTask.gasStationInfoProcessTask}")
	private String gasStationInfoProcessTask;
	
	private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private GasStationinfoService gasStationinfoService;
	@Value("${gasstation.videosQueryVideoGetGroupsOfflineUrl}")
	private String url;

	@Value("${gasstation.thirdPartyPass}")
	private String pass;
	@Value("${gasstation.thirdPartyUser}")
	private String user;
	
	public void run(String params) throws Exception {
		logger.debug("gasStationInfoProcessTask定时任务正在执行，参数为：{}", params);
		logger.debug("application参数为gasStationInfoProcessTask：{}", gasStationInfoProcessTask);

		if (gasStationInfoProcessTask.equals(Constants.JOB_STOP)) {


			logger.debug("application配置文件控制不执行gasStationInfoProcessTask定时任务");
			throw new Exception("application配置文件控制不执行gasStationInfoProcessTask定时任务");
		
		
		}
		
		
		// String url = "http://21.0.0.60:5000/Videos/QueryVideo/GetGroupsOffline";
		
		
		
		
		Map<String, Object> map = new HashMap<>();
		
		// 获取全量
		map.put("api", user);
		map.put("isMobile", "1");
		map.put("offline", "");
		map.put("parentId", "");
		map.put("parentType", "domain");
		map.put("sign", sign(url, map));
		
		// ==============================================================
		
		// 获取市、县区 等，区别是 parentType 参数 
		
		// 邢台市
		// String id = "5428b424-6e36-4fff-bde4-f80e8958cae2";
		// 信都区
		// String id = "02c520b4-9c2e-49a9-849e-e88ca848b4ef";
		// 内丘县
		// String id = "7b2f73cb-6315-412e-9b54-676778bbdfee";
		
		// map.put("api", user);
		// map.put("isMobile", "1");
		// map.put("offline", "0");
		// map.put("parentId", id);
		// map.put("parentType", "group");
		// map.put("sign", sign(url, map));
		// saveOrUpdateGasStationinfoTop(id); // 保存 当前条数据保存
		// ==============================================================
		
		String domainResponse = removeFirstAndLastChar(RestTemplateUtil.get(url, map));
		
		if (TsBqUtils.isNotNull(domainResponse)) {
			JSONArray domainJsonArray = JSONArray.parseArray(domainResponse);
			List<GasStationinfoEntity> listDomain = JSONArray.parseArray(JSON.toJSONString(domainJsonArray),
					GasStationinfoEntity.class);
			
			if (TsBqUtils.isNotNull(listDomain)) {
				
				for (GasStationinfoEntity domain : listDomain) {
					saveOrUpdateGasStationinfo(domain);
					String type = domain.getType();
					if(type.equals("group") || type.equals("domain")){
						requertRecursion(domain);
					}
				}
			}
		}
		
	    // TODO 处理数据  保留 危化企业 企业下面的
		
		
	}
	
	private void saveOrUpdateGasStationinfo(GasStationinfoEntity gasStationinfo){
		Date date = new Date();
		
		String id = gasStationinfo.getId();
		GasStationinfoEntity gasStationinfoEntity = gasStationinfoService.getById(id);
		
		if(TsBqUtils.isNotNull(gasStationinfoEntity)){
			
			gasStationinfo.setAddress(gasStationinfoEntity.getAddress());
			gasStationinfo.setTaxorgcode(gasStationinfoEntity.getTaxorgcode());
			gasStationinfo.setIsAnalyse(gasStationinfoEntity.getIsAnalyse());
			                                                   
			gasStationinfo.setGasLocation(gasStationinfoEntity.getGasLocation());
			gasStationinfo.setGasCoverage(gasStationinfoEntity.getGasCoverage());
			
			gasStationinfo.setUpdateId("sysjob");
			gasStationinfo.setUpdateTime(date);
			
		}else{
			gasStationinfo.setIsAnalyse("Y");
			gasStationinfo.setCreateTime(date);
			gasStationinfo.setCreateId("sysjob");
			
		}
		
		
		gasStationinfo.setDeleted(Constants.DELETEED_NOT);
		gasStationinfoService.saveOrUpdate(gasStationinfo);
	}
	
	
	private void requertRecursion(GasStationinfoEntity gasStationinfo) throws UnsupportedEncodingException{
		
		Map<String, Object> map = new HashMap<>();
		map.put("api", user);
		map.put("isMobile", "1");
		map.put("offline", "");
		map.put("parentId", gasStationinfo.getId());
		map.put("parentType", gasStationinfo.getType());
		map.put("sign", sign(url, map));
		String response = removeFirstAndLastChar(RestTemplateUtil.get(url, map));
		
		if (TsBqUtils.isNotNull(response)) {
			try {
				JSONArray jsonArray = JSONArray.parseArray(response);
			
				List<GasStationinfoEntity> list = JSONArray.parseArray(JSON.toJSONString(jsonArray),
						GasStationinfoEntity.class);
				
				if (TsBqUtils.isNotNull(list)) {
					for (GasStationinfoEntity gasStationinfoEntity : list) {
						
						saveOrUpdateGasStationinfo(gasStationinfoEntity);
						String type = gasStationinfoEntity.getType();
						if(type.equals("group") || type.equals("domain")){
							requertRecursion(gasStationinfoEntity);
						}
					}
				}
			
			} catch (Exception e) {
				logger.debug("gasStationInfoProcessTask定时任务正在执行，异常：{}", e.getMessage());

			}
		}
	}
	
	private String sign(String url, Map<String, Object> parameter) throws UnsupportedEncodingException {
		if (!parameter.isEmpty()) {
			url = url + "?";
			for (String key : parameter.keySet()) {
				url = url + key + "=" + parameter.get(key) + "&";
			}
			url = url.substring(0, url.length() - 1);
		}

		String encrypt = MD5Utils.encrypt(pass);
		byte[] hmacSHA256 = HmacSha256Utils.hmacSHA256(url, encrypt);
		byte[] encodedBytes = Base64.getEncoder().encode(hmacSHA256);
		String encodedString = URLEncoder.encode(new String(encodedBytes), "UTF-8");

		return encodedString;
	}

	public String removeFirstAndLastChar(String s) {
		if (s.length() <= 2) {
			return ""; // 如果字符串长度小于等于2，则返回空字符串
		}
		String str = s.substring(1, s.length() - 1);
		String replaceAll = str.replaceAll("\\\\","");
		return replaceAll;
		
	}

}
